/*
 * Bloque.cpp
 *
 *  Created on: 22/04/2014
 *      Author: manuel
 */

#include "Bloque.h"

Bloque::Bloque(unsigned int tamano) : data(tamano) , posicion_lectura(0), posicion_escritura(0) {
	iniciar();
}

Bloque::~Bloque() {
	data.clear();
}

void Bloque::iniciar() {
	memset(&data[0], 0, data.size());
	posicion_lectura = 0;
	posicion_escritura = 0;
}

bool Bloque::cargarDesde(std::fstream& archivo) {
	archivo.read((char*)&data[0], data.size() );

	posicion_escritura = archivo.gcount();

	if (archivo.fail()) {
		archivo.clear();
		return false;
	}
	return true;
}

bool Bloque::escribirEn(std::fstream& archivo) {
//	archivo.write((char*)&data[0], data.size());
	archivo.write((char*)&data[0], posicion_escritura);
	archivo.flush();

	if (archivo.fail()) {
		archivo.clear();
		return false;
	}
	return true;
}

unsigned int Bloque::getTamano() {
	return data.size();
}

unsigned char* Bloque::getData() {
	return data.data();
}

unsigned int Bloque::getPosicionEscritura(){
	return posicion_escritura;
}

bool Bloque::setData(unsigned char* new_data, unsigned int tam){
	if( posicion_escritura+tam > data.size() )
		return false;

	memcpy( &data[0]+posicion_escritura, new_data, tam );
	posicion_escritura += tam;
	return true;
}

int Bloque::compararCon(Bloque otroBloque) {
	if( data.size() > otroBloque.getTamano() )
		return 1;

	if ( data.size() < otroBloque.getTamano() )
		return -1;

	if( strcmp( (char*)data.data(), (char*)otroBloque.getData()) == 0 )
			return 0;

	return -1;
}

bool Bloque::leerByte(Byte& unByte) {
	if( posicion_lectura == data.size() )
		return false;

	unByte.cargarDesdeBloque(&data[posicion_lectura]);
	posicion_lectura++;
	return true;
}

bool Bloque::escribirByte(Byte& unByte) {
	if( posicion_escritura == data.size() )
		return false;

	unByte.escribirEnBloque(&data[posicion_escritura]);
	posicion_escritura++;
	return true;
}

void Bloque::resize(unsigned int nuevo_tamano) {
	data.resize(nuevo_tamano);
}

void Bloque::imprimir() {
	unsigned char aux[data.size()+1];
	memcpy(aux, data.data(), data.size());
	aux[data.size()] = '\0';
	std::cout << aux << std::endl;
}

